<?php

namespace App\Console\Commands;

use App\Service\KimiAIService;
use Illuminate\Console\Command;
use Illuminate\Redis\Connections\PhpRedisConnection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;

class GetJobDataThree extends Command
{
    protected $signature = 'get:job-data {--examtype=default_examtype} {--city=default_city} {--year=default_year} {--month=default_month}';
    protected $description = 'Individually update each job data record based on the given criteria';
    /** @var PhpRedisConnection redis */
    protected $redis; // Redis 实例
    protected $processingTypeKey = 'current_processing_type'; // Redis 键名，用于存储当前处理类型索引
    protected $jobLockKeyPrefix = 'job_lock_'; // Redis 锁的键名前缀

    public function __construct()
    {
        parent::__construct();

        // 连接到 Redis 服务器
        $this->redis = Cache::store('redis')->getStore()->connection();

    }

    public function handle()
    {
        ini_set('memory_limit', -1);
        set_time_limit(-1);

        // 获取传入的参数
        $examtype = $this->option('examtype');
        $city = $this->option('city');
        $year = $this->option('year');
        $month = $this->option('month');

        // 从 Redis 恢复之前的处理类型索引
        // $processingTypeIndex = $this->redis->get($this->processingTypeKey);
        // if ($processingTypeIndex === false) {
        //     // 如果没有找到之前的处理类型索引，从 0 开始
        //     $processingTypeIndex = 0;
        // } else {
        //     $processingTypeIndex = intval($processingTypeIndex);
        // }

        // 构建查询
        $query = DB::table('jobs');

        if ($examtype !== 'default_examtype') {
            $query->where('examtype', $examtype);
        }

        if ($city !== 'default_city') {
            $query->where('city', $city);
        }

        if ($year !== 'default_year') {
            $query->whereYear('pubdate', $year);
        }

        if ($month !== 'default_month') {
            $query->whereMonth('pubdate', $month);
        }

        $query->select(['id','info','result'])->where('status', -1);

        $updatedCount = 0;

        // 获取符合条件的数据并逐条更新
        $jobs = $query->orderBy('id', 'asc')->get();

        foreach ($jobs as $job) {
            try {
                if (!$job->info) {
                    continue;
                }
                if ($job->result) {
                    continue;
                }

                // 构建当前 job 的锁键名
                $jobLockKey = $this->jobLockKeyPrefix . $job->id;

                // 尝试获取锁，设置锁的超时时间为 180 秒
                $lockAcquired = $this->redis->set($jobLockKey, 1, 'EX', 60*3, 'NX');

                if (!$lockAcquired) {
                    // 如果无法获取锁，跳过当前 job
                    // $this->error("Failed to acquire lock for job ID {$job->id}. Skipping.");
                    continue;
                }

                // 获取当前处理类型索引并递增
                $processingTypeIndex = $this->redis->incr($this->processingTypeKey);
                // 计算当前处理类型
                $typeList = ['zhipu', 'kimi', 'yuejin','hailuo'];

                $typeIndex = $processingTypeIndex % count($typeList);

                $type = $typeList[$typeIndex];

                // 获取结果并更新数据库
                $result = $this->getResult($job, $type);
                $updateData = [
                    'type' => $type,
                ];

                if (!$result) {
                    $updateData['status'] = -1;
                } else {
                    $updateData['status'] = 1;
                    $updateData['result'] = json_encode($result, JSON_UNESCAPED_UNICODE);
                }

                $updateResult = DB::table('jobs')
                                  ->where('id', $job->id)
                                  ->update($updateData);

                if ($updateResult) {
                    $updatedCount++;
                    $this->info("Record with ID {$job->id} has been updated with type '{$type}'.");
                } else {
                    $this->error("Failed to update record with ID {$job->id}.");
                }
                // 释放锁
                $this->redis->del($jobLockKey);

            } catch (\Throwable $exception) {

                // 释放锁
                $this->redis->del($jobLockKey);

                $this->error("Failed to update record with ID {$job->id}: " . $exception->getMessage());
                continue;
            }
        }

        $this->info("Total {$updatedCount} record(s) have been updated.");
    }
    public function getResult($job, $type = '')
    {
        $content = $job->info;

        $prompt = <<<temp
请从招聘公告内容提取以下信息，请你认真去理解招聘公告的信息，请用中文回答我的内容，其中笔试时间、面试时间、成绩查询时间如果存在具体的时间，统一的时间格式为：2024-01-14这样的格式，招考人数如果存在确定的就显示为数字，面试比例如果可以确定的话只显示具体比列就可以了，提取到的所有信息将其以JSON格式返回，其中key使用英文标识,返回结果禁止出现markdown语法相关的标签，返回的结果仅为下面格式的json不要加其他文字：
- **笔试时间**：提取公告中的考试日期。
- **笔试内容**：提取公告中描述的笔试内容。
- **面试时间**：提取公告中的面试日期。
- **面试内容**：提取公告中描述的面试内容。
- **成绩查询时间**：提取公告中提到的成绩查询时间。
- **面试比例**：提取公告中提到的面试比例。
- **招考人数**：提取公告中提到的招考人数。
将这些信息整理成如下格式的JSON数组，并填入指定的key：
{
  "exam_date": "提取的笔试时间",
  "exam_content": "提取的笔试内容",
  "interview_date": "提取的面试时间",
  "interview_content": "提取的面试内容",
  "results_query_date": "提取的成绩查询时间",
  "interview_ratio": "提取的面试比例"
  "user_num": "提取的招考人数"
}
招聘公告内容如下:

{$content}
temp;

        try {
            $chatService = new KimiAIService(); // 假设这是你的 AI 服务类
            $result = $chatService->setType($type)->chat([
                "messages" => [
                    [
                        "role" => "user",
                        "content" => $prompt,
                    ],
                ],
                "temperature" => 0.6,
            ]);

            $content = $result['choices'][0]['message']['content'] ?? '';
            if (!$content) {
                return [];
            }

            $result = preg_replace('/^```json\s*|\s*```$/m', '', $content);
            $jsonResult=json_decode($result, true, JSON_UNESCAPED_UNICODE);
            if(!$jsonResult){
                $this->error("{$job->id}中gpt{$type}格式化失败:" . $result);
            }
            return $jsonResult;

        } catch (\Throwable $exception) {
            $this->error("{$job->id}中gpt{$type}获取失败:" . $exception->getMessage());
            return [];
        }
    }
}
